# coding=utf-8
import _thread as thread
import base64
import datetime
import hashlib
import hmac
import json
from urllib.parse import urlparse, urlencode
import ssl
from datetime import datetime
from time import mktime
from wsgiref.handlers import format_date_time
import websocket  # 使用 websocket_client
from PIL import Image
import io


# Function to resize the image
def resize_image(image_path, size):
    image = Image.open(image_path)
    resized_image = image.resize(size)
    return resized_image


# Function to encode the image
def encode_image(image):
    image_byte_array = io.BytesIO()
    image.save(image_byte_array, format='PNG')
    image_byte_array = image_byte_array.getvalue()
    return image_byte_array, base64.b64encode(image_byte_array).decode('utf-8')


class Ws_Param(object):
    # 初始化
    def __init__(self, APPID, APIKey, APISecret, imageunderstanding_url):
        self.APPID = APPID
        self.APIKey = APIKey
        self.APISecret = APISecret
        self.host = urlparse(imageunderstanding_url).netloc
        self.path = urlparse(imageunderstanding_url).path
        self.ImageUnderstanding_url = imageunderstanding_url

    # 生成url
    def create_url(self):
        now = datetime.now()
        date = format_date_time(mktime(now.timetuple()))
        signature_origin = "host: " + self.host + "\n"
        signature_origin += "date: " + date + "\n"
        signature_origin += "GET " + self.path + " HTTP/1.1"
        signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'), digestmod=hashlib.sha256).digest()
        signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')
        authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'
        authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
        v = {"authorization": authorization, "date": date, "host": self.host}
        url = self.ImageUnderstanding_url + '?' + urlencode(v)
        return url


def gen_params(appid, question):
    data = {
        "header": {"app_id": appid},
        "parameter": {
            "chat": {
                "domain": "image",
                "temperature": 0.1,
                "top_k": 4,
                "max_tokens": 2028,
                "auditing": "default"
            }
        },
        "payload": {"message": {"text": question}}
    }
    return data


def check_xunfei_image(appid, api_key, api_secret, imageunderstanding_url, image_path, question):
    # 处理图片
    # new_size = (1000, 1000)
    new_size = (500, 500)
    resized_image = resize_image(image_path, new_size)
    _, base64_image = encode_image(resized_image)

    # 更新 text 中的图片内容
    for item in question:
        if item["content_type"] == "image":
            item["content"] = base64_image

    # 设置 WebSocket 参数和回调
    wsParam = Ws_Param(appid, api_key, api_secret, imageunderstanding_url)
    wsUrl = wsParam.create_url()

    # 定义 on_message 回调函数来处理 WebSocket 消息
    answer = ""

    def on_message(ws, message):
        nonlocal answer  # 使用 nonlocal 声明以在内部函数中修改外部函数的变量
        data = json.loads(message)
        code = data['header']['code']
        if code != 0:
            print(f'请求错误: {code}, {data}')
            # logger.error("讯飞请求错误: code= %s, data: %s",  code, data)
            ws.close()
        else:
            choices = data["payload"]["choices"]
            status = choices["status"]
            content = choices["text"][0]["content"]
            # print(content, end="")
            answer += content
            if status == 2:
                # print("usage:", data["payload"]['usage'])
                ws.close()

    def on_error(ws, error):
        print("### error:", error)
        # logger.error("### error: %s",error)

    def on_close(ws, one, two):
        # print("WebSocket closed")
        pass

    def on_open(ws):
        def run(*args):
            data = json.dumps(gen_params(appid=ws.appid, question=ws.question))
            ws.send(data)

        thread.start_new_thread(run, ())

    # 创建并运行 WebSocket 应用
    ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open)
    ws.appid = appid
    ws.question = question
    ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

    return answer


def check_action_image(image_path, description):
    appid = "effb608f"  # 填写控制台中获取的 APPID 信息
    api_secret = "OTFmYzQwYTE2OGZhYTZkYzEwZDZlZjRj"  # 填写控制台中获取的 APISecret 信息
    api_key = "def41ba2e4f2e53e73dc1cea814345af"  # 填写控制台中获取的 APIKey 信息
    imageunderstanding_url = "wss://spark-api.cn-huabei-1.xf-yun.com/v2.1/image"  # 云端环境的服务地址

    # content = f"图片中是否有人在做'{description}'动作，如果是返回'是'，否则返回'否'"
    content = f"图片中是否有人在做'{description}'动作，如果是返回'是'，否则返回'否'；特别注意，结果只返回'是'或者'否'"

    question_text = [
        {"role": "user", "content": "", "content_type": "image"},
        {"role": "user", "content": content, "content_type": "text"}
    ]
    print(question_text)
    result = check_xunfei_image(appid, api_key, api_secret, imageunderstanding_url, image_path, question_text)
    if result == '是':
        return True
    else:
        return False


if __name__ == '__main__':
    result = check_action_image("2.png", "跑步")
    print(result)
